package com.nineclock.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.threadlocal.CurrentUserHolder;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.service.SysCompanyContactConfigService;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @Package: com.nineclock.system.service.impl
 * @ClassName: SysCompanyContactConfigServiceImpl
 * @Author: 小康
 * @CreateTime: 2021-06-08 20:46
 * @Description:
 */
@Service
@Transactional
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {

    @Autowired
    private SysCompanyContactConfigMapper companyContactConfigMapper;
/**
 *  @Date: 2021/6/12 16:10
 *  添加字段：1.校验前端数据，使用hutool工具类判断信息是否存在
 *             2.从当前线程中获取 企业id
 *             3.添加数据：利用BeanHelper工具类，将DTo（前端映射）格式，转化成pojo（映射数据库）格式。修改可变参数添加到对象中
 *                         定义mapper接口继承BaseMapper，逆向工程调用方法，添加数据
 */
    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO configDTO) {

        //参数校验
        if (configDTO == null || StrUtil.isEmpty(configDTO.getName())) {
          // throw new RuntimeException(ResponseEnum.INVALID_PARAM_ERROR.getMessage());
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //添加数据
        SysCompanyContactConfig contactConfig = BeanHelper.copyProperties(configDTO, SysCompanyContactConfig.class);
        contactConfig.setStatus((short) 1); // 设置状态 为1， 表示可用
        contactConfig.setCompanyId(companyId);//TODO 目前先将该企业ID设置为1 , 后续完善
        contactConfig.setFieldType("string"); //设置字段类型为字符串类型

        companyContactConfigMapper.insert(contactConfig);

    }

    /**
     * 思路：
     * 1. 先根据当前登录用户的企业id查询企业通讯录字段
     * 2. 如果查询为null，需为该企业初始化企业通讯录字段
     * 3. 如果查询不为null， 则返回该企业对应的企业通讯录字段
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompnayContactConfig() {
        List<SysCompanyContactConfigDTO> dtoList = new ArrayList<SysCompanyContactConfigDTO>();

        //获取企业ID -- 从登陆用户信息中, 获取当前企业的ID
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();


        //构造条件查询
        LambdaQueryWrapper<SysCompanyContactConfig> configWrapper = new LambdaQueryWrapper<SysCompanyContactConfig>();
        configWrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);
        List<SysCompanyContactConfig> sysCompanyContactConfigs = companyContactConfigMapper.selectList(configWrapper);

        //如果企业没有设置通讯录字段, 需要初始化默认值
        if (CollectionUtil.isEmpty(sysCompanyContactConfigs)) {
            for (String fieldName : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                SysCompanyContactConfig config = new SysCompanyContactConfig();
                config.setStatus((short) 1);
                config.setType("fixed");
                config.setName(fieldName);
                config.setFieldType("string");
                config.setCompanyId(companyId);
                companyContactConfigMapper.insert(config);

                dtoList.add(BeanHelper.copyProperties(config, SysCompanyContactConfigDTO.class));
            }

            return dtoList;
        }
        return BeanHelper.copyWithCollection(sysCompanyContactConfigs, SysCompanyContactConfigDTO.class);
    }

    //修改通讯录字段状态

    /**
     * 思路：
     * 1. 先根据id查询该企业通讯录
     * 2. 如果不存在， 则抛出运行时异常
     * 3. 如果能查询到，根据id更新企业通讯录信息
     *
     * @param id
     * @param status
     */
    @Override
    public void updateStatus(long id, short status) {
        SysCompanyContactConfig contactConfig = companyContactConfigMapper.selectById(id);

        if (contactConfig == null) {
            throw new RuntimeException(ResponseEnum.DATA_NOT_EXISTS.getMessage());
        }
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();


        contactConfig.setStatus(status);
        contactConfig.setCompanyId(companyId);//TODO 目前先将该企业ID设置为1 , 后续完善

        companyContactConfigMapper.updateById(contactConfig);
    }

    //删除通讯录子段
    @Override
    public void deleteStatus(Long id) {
//根据id查询信息
        SysCompanyContactConfig contactConfig = companyContactConfigMapper.selectById(id);
        if (contactConfig == null) {
            throw new RuntimeException(ResponseEnum.DATA_NOT_EXISTS.getMessage());
        }
        String type = contactConfig.getType();
        Short status = contactConfig.getStatus();
        System.out.println("显示："+status);
        //判断状态
        if(type.equals("fixed") || status==1){
            throw new RuntimeException(ResponseEnum.DELETE_OPERATION_FAIL.getMessage());
        }else {
            companyContactConfigMapper.deleteById(id);
        }
    }


}
